unit Thrad_TestCCID;
//ORDER BY ELE_CODE

interface

uses
  Classes,SysUtils,Class_KzThrad,GL_CCIDS,Uni,UniConnct,MD5,IniFiles,
  GL_COA_DETAIL,UniEngine,TypInfo;

type
  TThradTestCCID = class(TKzThrad)
  private
    FListCOAS:THashedStringList;//*list of *tglcoa
    FListCOAL:THashedStringList;//*list of *tglcoadetail
  public
    procedure FetchCOAL(ACOAID:string;var AList:TStringList);
  protected
    procedure Execute; override;
  public
    destructor Destroy; override;
  end;

implementation
uses
  Class_AppUtil,Class_KzUtils,Class_JvUtils;


destructor TThradTestCCID.Destroy;
begin
  if FListCOAL<>nil then TKzUtils.TryFreeAndNil(FListCOAL);
  inherited;
end;

procedure TThradTestCCID.Execute;
var
  I,M,N:Integer;

  Hash:Integer;
  Text:string;
  TMPA:string;
  TMPB:string;

  SQLA:string;
  Objt:TGLCCIDS;
  COAL:TGLCOADETAIL;

  KZCCID:Extended;
  KZMD5 :string;

  ListGUID :TStringList;
  ListCCID :TStringList;
  ListELES :TStringList;
  UniConnct:TUniConnection;
begin
  try
    UniConnct:=UniConnctEx.GetConnection(CONST_MARK_YOYO);
    try
      UniConnct.StartTransaction;
      //-<
      SQLA:='SELECT * FROM GL_CCIDS WHERE 1=1';
      if ListCCID=nil then
      begin
        ListCCID:=TStringList.Create;
      end;
      TKzUtils.JustCleanList(ListCCID);
      TGLCCIDS.ListDB(SQLA,UniConnct,ListCCID);

      if (ListCCID=nil) or (ListCCID.Count=0) then Exit;

      SQLA:='SELECT * FROM GL_COA_DETAIL ORDER BY COA_ID,ELE_CODE';
      if FListCOAL=nil then
      begin
        FListCOAL:=THashedStringList.Create;
      end;
      TKzUtils.JustCleanList(FListCOAL);
      TGLCOADETAIL.ListDB(SQLA,UniConnct,TStringList(FListCOAL));
      

      GetMaxProgress(ListCCID.Count);
      for I:=0 to ListCCID.Count -1 do
      begin
        GetOneProgress(I+1);
        
        Objt:=TGLCCIDS(ListCCID.Objects[I]);
        if Objt=nil then Continue;

        if ListELES=nil then
        begin
          ListELES:=TStringList.Create;
        end;
        ListELES.Clear;
        FetchCOAL(Objt.COAID,ListELES);

        ListGUID:=TStringList.Create;

        for N:=0 to ListELES.Count-1 do
        begin
          COAL:=TGLCOADETAIL(ListELES.Objects[N]);
          if COAL=nil then Continue;
          
          TMPA:=Format('%SID',[COAL.ELECODE]);
          TMPB:=GetPropValue(Objt,TMPA);
          if TMPB='' then TMPB:=COAL.DEFAULTVALUE;
          ListGUID.Add(TMPB);
        end;

        Hash:=0;
        Text:='';
        for M:=0 to ListGUID.Count-1 do
        begin
          TMPA:=Trim(ListGUID.Strings[M]);
          Hash:=Hash xor TJvUtils.hashCode(TMPA);

          if Trim(TMPA)='' then
          begin
            TMPA:='0';
          end;
          Text:=Text+TMPA;
        end;
        Text:=Format('%S-%S',[Objt.COAID,Text]);

        KZCCID:=StrToFloat(Format('%S%S%D',[TJvUtils.toString(StrToInt(Objt.COAID),9),'9',Abs(Hash)]));
        KZMD5 :=MD5.StrToMD5(Text);

        SQLA  :='UPDATE GL_CCIDS SET KZ_CCID=%F,KZ_MD5=%S WHERE CCID=%F';
        SQLA  :=Format(SQLA,[KZCCID,QuotedStr(KZMD5),Objt.CCID]);
        UniConnctEx.ExecuteSQL(SQLA,UniConnct);

        FreeAndNil(ListGUID);
        FreeAndNil(ListELES);
      end;

      //->
      UniConnct.Commit;
    except
      on E:Exception do
      begin
        UniConnct.Rollback;
        raise Exception.Create(E.Message);
      end;
    end;
  finally
    FreeAndNil(UniConnct);
    if ListCCID<>nil then TKzUtils.TryFreeAndNil(ListCCID);
  end;
end;

procedure TThradTestCCID.FetchCOAL(ACOAID: string; var AList: TStringList);
var
  I:Integer;
  Objt:TGLCOADETAIL;
begin
  AList.Clear;
  if (FListCOAL=nil) or (FListCOAL.Count=0) then Exit;

  for I:=0 to FListCOAL.Count-1 do
  begin
    Objt:=TGLCOADETAIL(FListCOAL.Objects[I]);
    if Objt=nil then Continue;

    if Objt.COAID=ACOAID then
    begin
      AList.AddObject('',Objt);
    end;
  end;
end;

end.

        if Objt.COAID='161' then
        begin
          //BI
          ListGUID.Add(Objt.BIID);          
          //BIS
          ListGUID.Add(Objt.BISID);
          //BL
          ListGUID.Add(Objt.BLID);          
          //BO
          ListGUID.Add(Objt.BOID);
          //BP
          ListGUID.Add(Objt.BPID);
          //BS
          ListGUID.Add(Objt.BSID);
          //BT
          ListGUID.Add(Objt.BTID);
          //EN
          ListGUID.Add(Objt.ENID);
          //FILE
          ListGUID.Add(Objt.FILEID);
          //GROUPID
          ListGUID.Add(Objt.GROUPIDID);
          //INPM
          ListGUID.Add(Objt.INPMID);
          //MB
          ListGUID.Add(Objt.MBID);
          //MK
          ListGUID.Add(Objt.MKID);
          //PK
          ListGUID.Add(Objt.PKID);
          //SALTAG
          ListGUID.Add(Objt.SALTAGID);
          //USEEN
          ListGUID.Add(Objt.USEENID);
        end else
        if Objt.COAID='87' then
        begin
          //PF
          ListGUID.Add(Objt.PFID);
          //PK
          ListGUID.Add(Objt.PKID);
          //SALTAG
          ListGUID.Add(Objt.SALTAGID);
          //USEEN
          if Trim(Objt.USEENID)='' then
          begin
            ListGUID.Add('{BFD8FA9C-F39B-11DB-AFE4-A9506F9D5976}');
          end else
          begin
            ListGUID.Add(Objt.USEENID);
          end;
          //BAC
          ListGUID.Add(Objt.BACID);
          //BAP
          ListGUID.Add(Objt.BAPID);
          //BI
          ListGUID.Add(Objt.BIID);
          //BIS
          ListGUID.Add(Objt.BISID);
          //BL
          ListGUID.Add(Objt.BLID);
          //BO
          ListGUID.Add(Objt.BOID);
          //BP
          ListGUID.Add(Objt.BPID);
          //BS
          ListGUID.Add(Objt.BSID);
          //BSI
          ListGUID.Add(Objt.BSIID);
          //BT
          ListGUID.Add(Objt.BTID);
          //CB
          ListGUID.Add(Objt.CBID);
          //EN
          ListGUID.Add(Objt.ENID);
          //FILE
          if Trim(Objt.FILEID)='' then
          begin
            ListGUID.Add('{FBB9C376-152A-11E0-9D53-B23A480D3931}');
          end else
          begin
            ListGUID.Add(Objt.FILEID);
          end;
          //GPBARN
          ListGUID.Add(Objt.GPBARNID);
          //GPPLAN
          ListGUID.Add(Objt.GPPLANID);
          //GROUPID
          if Trim(Objt.GROUPIDID)='' then
          begin
            ListGUID.Add('{810091CB-F39B-11DB-AFE4-A9506F9D5976}');
          end else
          begin
            ListGUID.Add(Objt.GROUPIDID);
          end;
          //INPM
          ListGUID.Add(Objt.INPMID);
          //MB
          ListGUID.Add(Objt.MBID);
          //MK
          ListGUID.Add(Objt.MKID);
          //PB
          ListGUID.Add(Objt.PBID);
        end else
        if Objt.COAID='88' then 
        begin
          //BAC
          ListGUID.Add(Objt.BACID);
          //BAP
          ListGUID.Add(Objt.BAPID);
          //CB
          ListGUID.Add(Objt.CBID);
          //EN
          ListGUID.Add(Objt.ENID);
          //INPM
          ListGUID.Add(Objt.INPMID);
          //MK
          ListGUID.Add(Objt.MKID);          
          //PB
          ListGUID.Add(Objt.PBID);          
          //PK
          ListGUID.Add(Objt.PKID);          
        end;
